﻿using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using System.Text;
using System.Security.Cryptography;
using System.Net.Mail;
using CP_SchoolForChildren_v0._1.Models.DataModel;
using CP_SchoolForChildren_v0._1.Models.RelatedModel;

namespace CP_SchoolForChildren_v0._1.Controllers.FE
{
    public class AccountController : Controller
    {
        private SFCEntities db = new SFCEntities();
        //
        // GET: /Account/

        // Log On
        public ActionResult LogOn(string returnUrl)
        {
            if (User.Identity.Name == "")
            {
                
                return View();
            }

            //ViewBag.Message = "Bạn đã đăng nhập";
           return RedirectToAction("index", "Home");
            return null;
        }

        [HttpPost]
        public ActionResult LogOn(LogOnModel model)
        {
            if (User.Identity.Name == "")
            {
                if (ModelState.IsValid)
                {
                    var check = new CheckUserProfile();
                    try
                    {
                        if (!check.isUsernameExist(model.UserName))
                        {
                            ViewBag.Message = "Tên đăng nhập không tồn tại";
                            return View(model);
                        }
                        var user = db.Users.Single(u => u.UserName == model.UserName);
                        if (user.IsActive == 0)
                        {
                            ViewBag.Message = "Tài khoản này chưa được kích hoạt";
                            return View(model);
                        }
                        if (0 !=
                            CompareMD5HashCode(check.GetPasswordFromUserName(model.UserName),
                                               GenerateMD5HashCode(model.Password)))
                        {
                            ViewBag.Message = "Password không đúng";
                            return View(model);
                        }
                        if (0 ==
                            CompareMD5HashCode(check.GetPasswordFromUserName(model.UserName),
                                               GenerateMD5HashCode(model.Password)))
                        {

                            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                            if (Request.UrlReferrer != null) 
                                return Redirect(Request.UrlReferrer.ToString());
                            else
                            {
                                return RedirectToAction("Index", "Home");
                            }
                            //return RedirectToAction("Index", "Home");
                        }
                    }
                    catch (Exception)
                    {
                        ViewBag.Message = "Đã có lỗi xảy ra trong quá trình đăng nhập. Vui lòng kiểm tra kết nối và thử lại";
                        return View(model);
                    }
                }
            }

            else if (User.Identity.Name != "")
            {

                return RedirectToAction("index", "Home");
            }
            
            // If we got this far, something failed, redisplay form
            return View(model);
        }

        //Log off
        public ActionResult LogOff()
        {
            FormsAuthentication.SignOut();
            if (Request.UrlReferrer != null) return Redirect(Request.UrlReferrer.ToString());
            return RedirectToAction("Index", "Home");
        }


        // Register

        public ActionResult Register()
        {
            if (User.Identity.Name == "")
            {
                return View();
            }
            
            return RedirectToAction("index", "Home");
        }

        [HttpPost]
        public ActionResult Register(RegisterModel model, string Gender)
        {
            try
            {
                if (Session["Captcha"] == null || Session["Captcha"].ToString() != model.Captcha)
                {
                    ModelState.AddModelError("Captcha", "Kết quả không chính xác, bạn hãy thử lại.");
                    return View(model);
                }
                if (ModelState.IsValid)
                {
                    var check = new CheckUserProfile();
                    if (check.isUsernameExist(model.UserName))
                    {
                        ViewBag.Message = "Tên đăng nhập đã tồn tại, mời bạn chọn tên đăng nhập khác";
                        return View(model);
                    }
                    else if (check.isEmailExist(model.Email))
                    {
                        ViewBag.Message = "Email đã tồn tại, mời bạn dùng địa chỉ email khác";
                        return View(model);
                    }
                    else
                    {
                        // insert new user
                        User user = new User();
                        user.Email = model.Email;
                        user.Password = GenerateMD5HashCode(model.Password);
                        user.UserName = model.UserName;
                        user.DOB = model.DOB;
                        user.Gender = Gender;
                        user.ActiveKey = GenerateMD5HashCode(model.Email + DateTime.Now);
                        user.RoleID = 3;
                        user.IsActive = 0;

                        db.Users.Add(user);
                        db.SaveChanges();
                        //remove session capcha
                        Session.RemoveAll();
                        //send mail active

                        SmtpClient SmtpServer = new SmtpClient();
                        SmtpServer.Credentials = new System.Net.NetworkCredential("timtruongchobe01@gmail.com", "timtruongchobe");
                        SmtpServer.Port = 587;
                        SmtpServer.Host = "smtp.gmail.com";
                        SmtpServer.EnableSsl = true;
                        MailMessage mail = new MailMessage();

                        Session["MaXacNhan"] = user.ActiveKey;
                        mail.From = new MailAddress("noreply@gmail.com", "Chào mừng bạn đến với timtruongchobe.com", Encoding.UTF8);
                        mail.To.Add(model.Email);
                        mail.Subject = "Mail kích hoạt tài khoản tại timtruongchobe.com!";
                        int id = user.UserID;
                        string body = "Vui lòng nhấn vào đường link dưới đây để kích hoạt tài khoản của bạn";
                        body += " http://localhost:4337/Account/ActiveAccount?input=" + id + "-" +
                                Session["MaXacNhan"].ToString();
                        mail.Body = body;

                        mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
                        mail.ReplyTo = new MailAddress(model.Email);
                        SmtpServer.Send(mail);
                        

                        ViewBag.Message =
                            "chúng tôi đã gửi link kích hoạt đến địa chỉ email mà bạn đã đăng ký. Hãy kiểm tra và ấn vào link kích hoạt để kích hoạt tài khoản tại website : timtruongchobe.com";
                        return View("Result");
                    }
                }
                return View(model);
            }
            catch (Exception)
            {
                ViewBag.Message = "Đã xảy ra lỗi trong quá trình đăng ký. Vui lòng kiểm tra kết nối và thử lại.";
                return View(model);
            }
            // If we got this far, something failed, redisplay form
            return View(model);
        }


        //
        // GET: RegisterResult

        public ActionResult Result()
        {
            return View();
        }

        // Begin Generate MD5 HashCode method
        public static string GenerateMD5HashCode(string strInput)
        {
            MD5 md5 = System.Security.Cryptography.MD5.Create();
            byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(strInput);
            byte[] hash = md5.ComputeHash(inputBytes);

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hash.Length; i++)
            {
                sb.Append(hash[i].ToString("x2"));
            }
            return sb.ToString();
        }

        // Begin Compare 2 string MD5 HashCode method
        public static int CompareMD5HashCode(string st1, string st2)
        {
            return st1.CompareTo(st2);
        }


        // Active account
        public ActionResult ActiveAccount(string input)
        {
            try
            {
                string[] add = HttpUtility.HtmlEncode(input).Split('-');

                int id = int.Parse(add[0]);
                string ActiveKey = add[1];
                User user = db.Users.Single(p => p.UserID == id);

                if (user.ActiveKey == ActiveKey && user.IsActive == 0)
                {
                    user.IsActive = 1;
                    db.Entry(user).State = System.Data.EntityState.Modified;
                    db.SaveChanges();
                    
                    ViewBag.Message =
                        "Tài khoản của bạn đã được kích hoạt thành công. Cảm ơn bạn đã tạo tài khoản tại website của chúng tôi.";
                    return View("Result");
                }
                else
                {
                    ViewBag.Message = "Link kích hoạt không đúng hoặc đã được kích hoạt thành công.";
                    return View("Result");
                    ;
                }
            }
            catch (Exception)
            {
                ViewBag.Message = "Đã có lỗi xảy ra. Vui lòng quay lại trang chủ và thử lại";
                return View("Error");
            }
        }

        // Reset password
        public ActionResult ForgotPasswordView()
        {
            return View();
        }

        public ActionResult ForgotActive(string input)
        {
            string[] add = HttpUtility.HtmlEncode(input).Split('-');
            int id = int.Parse(add[0]);
            string ResetPasswordKey = add[1];

            User user = db.Users.FirstOrDefault(u => u.UserID == id);
            if (user.ForgotKey == ResetPasswordKey)
            {
                user.Password = GenerateMD5HashCode("123456");
                db.Entry(user).State = System.Data.EntityState.Modified;
                db.SaveChanges();

                SmtpClient SmtpServer = new SmtpClient();
                SmtpServer.Credentials = new System.Net.NetworkCredential("timtruongchobe01@gmail.com", "timtruongchobe");
                SmtpServer.Port = 587;
                SmtpServer.Host = "smtp.gmail.com";
                SmtpServer.EnableSsl = true;
                MailMessage mail = new MailMessage();
                mail.From = new MailAddress("noreply@gmail.com", "timtruongchobe.com gui mail xac nhan",
                                            System.Text.Encoding.UTF8);
                mail.To.Add(user.Email);
                mail.Subject = "Welcome to Mywebsite!";

                string body = "Mật khẩu mới của bạn là: 123456";

                mail.Body = body;

                mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
                mail.ReplyTo = new MailAddress(user.Email);
                SmtpServer.Send(mail);
                ViewBag.Message = "Chúng tôi đã gửi mật khẩu mới đến Email của bạn.";
                user.ForgotKey = GenerateMD5HashCode(user.Email + DateTime.Now.ToString());
                db.Entry(user).State = System.Data.EntityState.Modified;
                db.SaveChanges();
                return View("Result");
            }
            else
            {
                ViewBag.Message = "Link kích hoạt không đúng ";
                return View("Result");
                ;
            }
        }

        [HttpPost]
        public ActionResult ForgotPasswordView(ForgotPasswordModel model)
        {
            if (ModelState.IsValid)
            {
                CheckUserProfile check = new CheckUserProfile();
                User user = new User();
                if (!check.isEmailExist(model.Email))
                {
                    ViewBag.Message = "Không tìm thấy địa chỉ " + model.Email + " trong dữ liệu";
                    return View("ForgotPasswordView");
                }
                else
                {
                    user = db.Users.FirstOrDefault(u => u.Email == model.Email);
                    user.ForgotKey = GenerateMD5HashCode(model.Email + DateTime.Now.ToString());
                    db.Entry(user).State = System.Data.EntityState.Modified;
                    db.SaveChanges();

                    //begin send mail to active
                    SmtpClient SmtpServer = new SmtpClient();
                    SmtpServer.Credentials = new System.Net.NetworkCredential("timtruongchobe01@gmail.com", "timtruongchobe");
                    SmtpServer.Port = 587;
                    SmtpServer.Host = "smtp.gmail.com";
                    SmtpServer.EnableSsl = true;
                    MailMessage mail = new MailMessage();

                    Session["MaXacNhan"] = user.ForgotKey;
                    mail.From = new MailAddress("ninhdt00935@fpt.edu.vn", "timtruongchobe.com gui mail xac nhan",Encoding.UTF8);
                    mail.To.Add(model.Email);
                    mail.Subject = "Welcome to Mywebsite!";
                    int id = user.UserID;
                    string body = "Vui lòng nhấn vào đường dẫn dưới đây để đổi mật khẩu : \n";
                    body += "http://localhost:4337/Account/ForgotActive?input=" + id + "-" +
                            Session["MaXacNhan"].ToString();
                    mail.Body = body;

                    mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
                    mail.ReplyTo = new MailAddress(model.Email);
                    SmtpServer.Send(mail);
                    //end send mail to active

                    ViewBag.Message =
                        "Chúng tôi đã gửi link quên mật khẩu đến địa chỉ email của bạn. Bạn hãy kiểm tra hòm thư và nhấn vào link kích hoạt để đổi mật khẩu tài khoản này.";
                    return View("Result");
                }
            }
            return RedirectToAction("ForgotPasswordView");
        }

        public ActionResult CaptchaImage(string prefix, bool noisy = true)
        {
            var rand = new Random((int)DateTime.Now.Ticks);

            //generate new question
            int a = rand.Next(10, 99);
            int b = rand.Next(0, 9);
            var captcha = string.Format("{0} + {1} = ?", a, b);

            //store answer
            Session["Captcha" + prefix] = a + b;

            //image stream
            FileContentResult img = null;

            using (var mem = new MemoryStream())
            using (var bmp = new Bitmap(130, 30))
            using (var gfx = Graphics.FromImage((Image)bmp))
            {
                gfx.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
                gfx.SmoothingMode = SmoothingMode.AntiAlias;
                gfx.FillRectangle(Brushes.White, new Rectangle(0, 0, bmp.Width, bmp.Height));

                //add noise
                if (noisy)
                {
                    int i, r, x, y;
                    var pen = new Pen(Color.Yellow);
                    for (i = 1; i < 10; i++)
                    {
                        pen.Color = Color.FromArgb(
                        (rand.Next(0, 255)),
                        (rand.Next(0, 255)),
                        (rand.Next(0, 255)));

                        r = rand.Next(0, (130 / 3));
                        x = rand.Next(0, 130);
                        y = rand.Next(0, 30);

                        gfx.DrawEllipse(pen, x - r, y - r, r, r);
                    }
                }

                //add question
                gfx.DrawString(captcha, new Font("Tahoma", 15), Brushes.Gray, 2, 3);

                //render as Jpeg
                bmp.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg);
                img = this.File(mem.GetBuffer(), "image/Jpeg");
            }

            return img;
        }
    }
}